import string
import secrets
import random
import sys # 导入 sys 模块来处理命令行参数


def generate_guaranteed_password(length=8):
    """
    生成一个保证包含至少一个大写、一个小写、一个数字和一个特殊字符的强密码。
    """
    if length < 4:
        # 密码长度必须至少为 4，才能保证包含四种必需的字符类型
        raise ValueError("Password length must be at least 4 to guarantee complexity.")

    # 1. 定义字符集
    set_upper = string.ascii_uppercase
    set_lower = string.ascii_lowercase
    set_digits = string.digits
    
    # 特殊字符集 (包含引号和反斜杠)
    set_special = '!@#$%^&*()_+=?~`<>[]{}|.,:;/-"\'\\' 
    
    # 组合所有字符集
    set_all = set_upper + set_lower + set_digits + set_special

    # 2. 强制包含必需的 4 个字符
    password_list = []
    
    # 确保每种类型至少一个
    password_list.append(secrets.choice(set_upper))
    password_list.append(secrets.choice(set_lower))
    password_list.append(secrets.choice(set_digits))
    password_list.append(secrets.choice(set_special))
    
    # 3. 填充剩余的长度
    remaining_length = length - len(password_list)
    
    for _ in range(remaining_length):
        password_list.append(secrets.choice(set_all))
        
    # 4. 随机打乱顺序
    random.shuffle(password_list)
    
    # 5. 将列表转换为字符串并返回
    return "".join(password_list)

# --- 命令行参数处理逻辑 ---
if __name__ == "__main__":

    # 默认密码长度
    target_length = 8

    # 检查是否有命令行参数传入 (sys.argv[0] 是脚本名称本身)
    if len(sys.argv) > 1:

        input_arg = sys.argv[1]

        # ⭐ 增强的数字检查：检查参数是否为纯数字
        if not input_arg.isdigit():
            print(f"Error: Length argument '{input_arg}' must be a positive integer (digits only).", file=sys.stderr)
            print("Usage: python3 passgen.py [length]", file=sys.stderr)
            sys.exit(1)

        try:
            # 现在我们确定它只包含数字，可以安全地转换
            target_length = int(input_arg)

            # 确保密码长度为正数
            if target_length <= 0:
                raise ValueError("Length must be a positive integer.")

        except ValueError as e:
            # 这个 except 现在主要捕获 target_length <= 0 抛出的 ValueError
            # 或者其他极少见的转换问题
            print(f"Error processing length: {e}", file=sys.stderr)
            print("Usage: python3 passgen.py [length]", file=sys.stderr)
            sys.exit(1)

    try:
        # 生成并打印密码
        password = generate_guaranteed_password(target_length)
        print(f"Generated Password ({target_length} chars): {password}")

    except ValueError as e:
        print(f"Error: {e}", file=sys.stderr)
        print("Usage: python3 passgen.py [length]", file=sys.stderr)
        sys.exit(1)
